<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>ECMAScript 逻辑运算符</title>
    <script>

        // 逻辑运算 和 位运算还是有所区别 注意首先运算符就有不同
        /*
        ToBoolean
        Undefined	false
        Null	false
        Boolean	结果等于输入的参数（不转换）
        Number	如果参数为 +0, -0 或 NaN，则结果为 false；否则为 true。 // 这里W3C 说的 不对 
        String	如果参数为空字符串，则结果为 false；否则为 true。
        Object	true
        */
        function testToBoolean(){
            var undei;  // false
            var nu = null;  // false 
            var tr = true;  // true
            var fa = false;  //  false
            var num = 123.456;  // true
            var emptyStr = "";  // false
            var str = "hello";  // true
            console.log(new Boolean(undei))
            console.log(new Boolean(nu))
            console.log(new Boolean(tr))
            console.log(new Boolean(fa))
            console.log(new Boolean(num))
            console.log(new Boolean(emptyStr))
            console.log(new Boolean(str))


            // 或者这种操作
            var obj = {
                "name":"this is a new day"
            }
            console.log(Boolean(obj))  // 这种 和 new Boolean()  还是右边 一个是Boolean 对象一个 是 Boolean的值 还是有区别
        }

        /*
        逻辑 NOT 运算符
        在 ECMAScript 中，逻辑 NOT 运算符与 C 和 Java 中的逻辑 NOT 运算符相同，都由感叹号（!）表示。

        与逻辑 OR 和逻辑 AND 运算符不同的是，逻辑 NOT 运算符返回的一定是 Boolean 值。

        逻辑 NOT 运算符的行为如下：

        如果运算数是对象，返回 false
        如果运算数是数字 0，返回 true
        如果运算数是 0 以外的任何数字，返回 false
        如果运算数是 null，返回 true
        如果运算数是 NaN，返回 true
        如果运算数是 undefined，发生错误
        */
        function testCycle(){
            var  aValues = ["DeLong","Hello",false,123,true];
            var  i = 0;
            var bFound = false;
            var vSearchValue = false

            // 注意是  ！ 运算符
            while(!bFound){
                if (aValues[i] == vSearchValue){
                    bFound = true;
                    alert("使用bFound 控制了循环")
                }else{
                    i++
                }
            }
        }

        /*
        测试 逻辑与 注意 和位运算中的区别 
        有点不确定的是  逻辑与运算中  A && B 如果 A已经是 false 那么不会再去计算 B的值 如果 B 是一个表达式的 
        在 OC 和 swift Java 中是这么做 优化的 
        */
        function testLogicAnd(){

            var bTrue = true;
            var bFalse = false;
            var bResult = bTrue && bFalse;
            alert(bResult);  
        }

        /*
        逻辑 OR 运算符
        ECMAScript 中的逻辑 OR 运算符与 Java 中的相同，都由双竖线（||）表示：
        */ 
        function testLogicOr(){

            var bTrue = true;
            var bFalse = false;
            var bResult = bTrue || bFalse;
            alert(bResult);  // 
        }

    </script>
</head>
<body>
    <button onclick="testToBoolean()">测试ToBoolean</button>
    <button onclick="testCycle()">测试 testCycle </button>
    <button onclick="testLogicAnd()">测试 逻辑与 </button>
    <button onclick="testLogicOr()">测试 逻辑或</button>
</body>
</html>